package Misil;

import java.util.Random;

import Misil.Comportamientos.ComportamientoMisilAliado;
import Misil.Comportamientos.DerechoAlChoque;
import Utilidades.CalculadoraDeMisiles;

/**
 * @brief Clase MisilEnemigo: define el comportamiento de los misiles enemigos.
 * @author Marcelo
 * @version 1.0
 * @created 17-jul-2012 09:08:46 p.m.
 */
public class MisilEnemigo extends Misil {

	// Campos de la clase MisilEnemigo
	private boolean gonnaDie;

	/**
	 * @brief Constructor predeterminado de la clase MisilEnemigo. Genera un
	 *        nuevo MisilEnemigo con una posicion y velocidad aleatorias. El
	 *        campo "gonnaDie" indica si ha sido fijado como blanco de un misil
	 *        aliado o no.
	 */
	public MisilEnemigo() {
		super();
		comportamiento = new DerechoAlChoque();
		Random random = new Random();
		posicion[0] = random.nextInt(100000) - 50000;
		posicion[1] = (long) Math.sqrt(Math.pow(50000, 2)
				- Math.pow(posicion[0], 2)) + 1;
		posicion[2] = random.nextInt(1500) + 3500;
		velocidad = random.nextInt(40) + 80;
		gonnaDie = false;

		if (random.nextInt(2) == 1) {
			posicion[1] = -posicion[1];
		}
		System.out.println("Se genero el misilEnemigo con las posiciones: "
				+ "X=" + posicion[0] + ",  Y=" + posicion[1] + ",  Z="
				+ posicion[2]);

		generarVectorDeVelocidad();
	}

	/**
	 * @brief Constructor alternativo de la clase MisilEnemigo. Genera un nuevo
	 *        MisilEnemigo Con una velocidad y posicion determinados.
	 * @param posicion
	 *            inicial del misil
	 * @param velocidad
	 *            del misil
	 */
	public MisilEnemigo(double[] posicion, int velocidad) {
		super();
		comportamiento = new DerechoAlChoque();
		this.posicion = posicion;
		gonnaDie = false;
		this.velocidad = velocidad;
		generarVectorDeVelocidad();
	}

	/**
	 * @brief Metodo utilizado para establecer que este misil ha sido fijado
	 *        como blanco y sera destruido brevemente.
	 */
	public void setGonnaDieTrue() {
		gonnaDie = true;
	}

	/**
	 * @brief Metodo que devuelve el valor actual del campo gonnaDie
	 * @return {@code true} si el misil esta marcado ya como objetivo
	 *         {@code false} si el misil es un nuevo enemigo detectado
	 */
	public boolean getGonnaDie() {
		return gonnaDie;
	}

	/**
	 * @brief Metodo que genera un valor nuevo para el vector de velocidad del
	 *        misil a partir de su vector de posicion inicial. El resultado se
	 *        almacena en el campo vectorVelocidad.
	 */
	private void generarVectorDeVelocidad() {
		Random random = new Random();
		double[] vectorVelocidad = new double[3];
		double valMax = (double) velocidad / 1.5;
		int halfValMax = (int) valMax / 2;
		// System.out.println("ValMax "+valMax+" and half: "+halfValMax);

		// Componente X
		if (posicion[0] > 0) {
			vectorVelocidad[0] = (double) -(valMax - random.nextInt(halfValMax));
		} else {
			vectorVelocidad[0] = (double) (valMax - random.nextInt(halfValMax));
		}
		// Componente Y
		if (posicion[1] > 0) {
			vectorVelocidad[1] = (double) -(valMax - random.nextInt(halfValMax));
		} else {
			vectorVelocidad[1] = (double) (valMax - random.nextInt(halfValMax));
		}
		// Componente Z
		vectorVelocidad[2] = (double) -(Math.sqrt(velocidad * velocidad
				- vectorVelocidad[0] * vectorVelocidad[0] - vectorVelocidad[1]
				* vectorVelocidad[1]));

		System.out.print(ID);
		System.out.print("Vector Velocidad: ("
				+ CalculadoraDeMisiles.redondear(vectorVelocidad[0], 2)
				+ ";"
				+ CalculadoraDeMisiles.redondear(vectorVelocidad[1], 2)
				+ ";"
				+ CalculadoraDeMisiles.redondear(vectorVelocidad[2], 2)
				+ ")   Velocidad: "
				+ Math.sqrt(vectorVelocidad[0] * vectorVelocidad[0]
						+ vectorVelocidad[1] * vectorVelocidad[1]
						+ vectorVelocidad[2] * vectorVelocidad[2]) + "/"
				+ velocidad + "   ");
		System.out.println("Posicion Inicial: (" + posicion[0] + ";"
				+ posicion[1] + ";" + posicion[2] + ")");

		comportamiento.setVectorDeVelocidad(vectorVelocidad);
	}

	/**
	 * @brief Devuelve el comportamiento de este misil
	 * @return comportamiento del misil
	 */
	public ComportamientoMisilAliado getComportamiento() {
		return comportamiento;
	}

}